#include "bib_Log.h"

extern CONFIG_EST config;
extern HANDLE mutexLog;

static int tiempo(char *);

int imprimirLog(int tipo, const char *cadena, const char *cadena1){
	HANDLE archivo;
	char cadenaImpresa [2 * TAM_MAX];
	char cadenaGuardada [2 * TAM_MAX];
	char tipoMensaje[TAM_MAX];
	char hora[TAM_MAX];
	DWORD cant, resultado;
	
	if ((resultado = WaitForSingleObject(mutexLog, INFINITE)) == WAIT_FAILED){
		printf(ERROR_FATAL_LOG);
		printf("No se pudo tomar control del mutexLog: %d", GetLastError());
		return EXIT_FAILURE;
	}
	
	else if(resultado == WAIT_ABANDONED){
		printf(ERROR_FATAL_LOG);
		printf("El hilo propietario del mutexLog acabo sin devolver el control");
		return EXIT_FAILURE;
	}
	
	if (tiempo(hora)){
		ReleaseMutex(mutexLog);
		return EXIT_FAILURE;
	}
	
	switch (tipo){
	case ERROR:
		strcpy(tipoMensaje, "ERROR:");
		break;
	case WARNING:
		if (config.nivelLog < 1){
			ReleaseMutex(mutexLog);
			return EXIT_SUCCESS;
		}
		strcpy(tipoMensaje, "WARN:");
		break;
	case INFO:
		if (config.nivelLog < 2){
			ReleaseMutex(mutexLog);
			return EXIT_SUCCESS;
		}
		strcpy(tipoMensaje, "INFO:");
		break;
	case DEBUG:
		if (config.nivelLog < 3){
			ReleaseMutex(mutexLog);
			return EXIT_SUCCESS;
		}
		strcpy(tipoMensaje, "DEBUG:");
		break;
	default:
		strcpy(tipoMensaje, "NIVEL detalle no valido:");
		break;
	}
	
	sprintf(cadenaImpresa, "[%lu]   %s %s %s \r\n", GetCurrentThreadId(), tipoMensaje, cadena, cadena1);
	printf("%s", cadenaImpresa);
	sprintf(cadenaGuardada, "%s     %s     [%ld]     %s", hora, PROCESO, GetCurrentProcessId(), cadenaImpresa);
	
	if (abrirArchivo(&archivo, ARCHIVO_LOG, GENERIC_WRITE, OPEN_ALWAYS)){
		printf(ERROR_FATAL_LOG);
		printf("No se logro abrir el archivo Log.txt\n");
		ReleaseMutex(mutexLog);
		return EXIT_FAILURE;
	}
	
	cant = (DWORD) strlen(cadenaGuardada);
	SetFilePointer(archivo, 0, NULL, FILE_END);
	
	if (escribirArchivo(archivo, cadenaGuardada, &cant)){ 
		printf(ERROR_FATAL_LOG);
		printf("No se pudo escribir el mensaje %s\n", cadenaGuardada);
		ReleaseMutex(mutexLog);
		return EXIT_FAILURE;
	}
		
	if (liberarHandle(archivo)){
		printf(ERROR_FATAL_LOG);
		printf("Error al cerrar el archivo Log\n");
		ReleaseMutex(mutexLog);
		return EXIT_FAILURE;
	}
	
	if (!ReleaseMutex(mutexLog)){
		printf(ERROR_FATAL_LOG);
		printf("No se pudo liberar el control del mutexLog: %d", GetLastError());
		return EXIT_FAILURE;
	}
		
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
static int tiempo(char *hora){
	time_t tiemp;
	struct tm *tmPtr;

	tiemp = time(NULL);
	tmPtr = localtime(&tiemp);
	strftime(hora, 20, "[%d/%m/%y %H:%M]", tmPtr); /* Arma la estructura a mostrar*/
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int crearMutexLog(void){

	if ((mutexLog = CreateMutex(NULL, FALSE, NULL)) == NULL){
		printf("No se pudo crear el mutex para el Log: %d\n", GetLastError());
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}